/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.model.DAO.User;

import com.myapp.model.DAO.HibernateUtil;
import com.myapp.model.usuaLeng.Usualeng;
import com.myapp.model.usuarios.Usuarios;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author jaime
 */
public class UserDao {
    /**
     * Metodo que devuelve un usuario por su email
     * @param Usuarios usr
     * @return Usuarios
     */
    public Usuarios search(Usuarios usr) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            session.beginTransaction();

            //Consulta de comprobacion de login y password correctos
            usr = (Usuarios) session.createCriteria(Usuarios.class).
                    add(Restrictions.eq("email", usr.getEmail())).uniqueResult();
            session.getTransaction().commit();

        } catch (HibernateException err) {
            session.getTransaction().rollback();
        }
        return usr;
    }
    /**
     * Metodo que devuelve un usuario por su id
     * @param Usuarios usr
     * @return Usuarios
     */
    public Usuarios buscarPorId(Usuarios usr) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            session.beginTransaction();

            //Consulta de comprobacion de login y password correctos
            usr = (Usuarios) session.createCriteria(Usuarios.class).
                    add(Restrictions.eq("idusuario", usr.getIdusuario())).uniqueResult();
            session.getTransaction().commit();

        } catch (HibernateException err) {
            session.getTransaction().rollback();
        }
        return usr;
    }
    /**
     * Metodo que devuelve un usuario con el alias y password introducido
     * @param Usuarios usr
     * @return Usuarios
     */
    public Usuarios login(Usuarios usr) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            session.beginTransaction();
            /*
             * usr= (Usuarios) session.createQuery("from Usuarios where
             * alias="+usr.getAlias()).uniqueResult();
             * session.getTransaction().commit();
             */
            //Consulta de comprobacion de login y password correctos
            usr = (Usuarios) session.createCriteria(Usuarios.class).
                    add(Restrictions.eq("alias", usr.getAlias())).
                    add(Restrictions.eq("password", usr.getPassword())).uniqueResult();
            session.getTransaction().commit();

        } catch (HibernateException err) {
            session.getTransaction().rollback();
        }
        return usr;
    }
    
    /**
     * Metodo que actualiza Usuarios marcandolo como Conectado
     * @param Usuarios usr
     * @return Usuarios
     */
    public Usuarios conectar(Usuarios usr) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        byte c = 1;// "Conectado"
        usr.setConectado(c);

        try {

            session.beginTransaction();
            session.update(usr);
            session.getTransaction().commit();
        } catch (HibernateException err) {
            session.getTransaction().rollback();
        }
        return usr;
    }

    /**
     * Metodo que actualiza Usuarios marcandolo como Desconectado
     * @param Usuarios usr 
     */
    public void logout(Usuarios usr) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        //Estados est = new Estados();
        byte e = 0;//Estado de "no conectado" en la tabla estados de la base de datos
        usr.setConectado(e);
        session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            session.beginTransaction();
            session.update(usr);
            session.getTransaction().commit();
        } catch (HibernateException err) {
            session.getTransaction().rollback();
        }
    }
    
    /**
     * Metodo que crea o actualiza un usuario
     * @param Usuarios usr
     * @return Usuarios
     */
    public Usuarios newOrUpdateUser(Usuarios usr) {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            session.beginTransaction();
            session.saveOrUpdate(usr);
            session.getTransaction().commit();
        } catch (Exception err) {
            session.getTransaction().rollback();
        }

        //Llamada a la funcion de Java Mail para autentificar al usuario
        return usr;
    }
    
    /**
     * Metodo que guarda el nivel del usuario
     * @param Usualeng usuaLeng 
     */
    public void darnivel(Usualeng usuaLeng) {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            session.beginTransaction();
            session.save(usuaLeng);
            session.getTransaction().commit();
        } catch (Exception err) {
            session.getTransaction().rollback();
        }

    }

    /**
     * Metodo que incrementa la disponibilidad para corregir ejercicios
     * @param Usuarios userAutor 
     */
    public void aumentarDisponCorreg(Usuarios userAutor) {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        try {
            byte dispCorregir = userAutor.getDispcorregir();
            ++dispCorregir;

            userAutor.setDispcorregir(dispCorregir);
            session.beginTransaction();
            session.update(userAutor);
            session.getTransaction().commit();

        } catch (Exception e) {
            session.getTransaction().rollback();
        }

    }

    /**
     * Metodo que disminuir la disponibilidad para corregir ejercicios
     * @param Usuarios userAutor 
     */
    public void disminuirDisponCorreg(Usuarios userAutor) {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        try {
            byte dispCorregir = userAutor.getDispcorregir();
            --dispCorregir;

            userAutor.setDispcorregir(dispCorregir);
            session.beginTransaction();
            session.update(userAutor);
            session.getTransaction().commit();

        } catch (Exception e) {
            session.getTransaction().rollback();
        }
    }
}
